/**
 * @description: 多语言函数
 * @file: methods.ts
 * @author: Evan
 * @date: 2025.06.23 18:28:59
 * @week: 周一
 * @version: V
 */

// 如果数字含有小数部分，那么可以将小数部分单独取出
// 将小数部分的数字转换为字符串的方法：
const chnNumChar = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
const chnUnitSection = ['', '万', '亿', '万亿', '亿亿']
const chnUnitChar = ['', '十', '百', '千']
const numToChn = (num: number) => {
  let index = num.toString().indexOf('.')
  if (index != -1) {
    let str = num.toString().slice(index)
    let a = '点'
    for (let i = 1; i < str.length; i++) {
      a += chnNumChar[parseInt(str[i])]
    }
    return a
  } else {
    return ''
  }
}

// 定义在每个小节的内部进行转化的方法，其他部分则与小节内部转化方法相同
const sectionToChinese = (section: number) => {
  // zero为是否进行补零， 第一次进行取余由于为个位数，默认不补零
  let str = '',
    chnstr = '',
    zero = false,
    count = 0
  while (section > 0) {
    // 对数字取余10，得到的数即为个位数
    let v = section % 10
    // 如果数字为零，则对字符串进行补零
    if (v == 0) {
      // 如果遇到连续多次取余都是0，那么只需补一个零即可
      if (zero) {
        zero = false
        chnstr = chnNumChar[v] + chnstr
      }
    } else {
      // 第一次取余之后，如果再次取余为零，则需要补零
      zero = true
      str = chnNumChar[v]
      str += chnUnitChar[count]
      chnstr = str + chnstr
    }
    count++
    section = Math.floor(section / 10)
  }
  return chnstr
}

/**
 * 数字转换汉字
 * @param { number } num 需转换汉字的数值
 * @return { string } 汉化后的字符串
 * @example
 * numberToChinese( 123456789 )
 */
export const numberToChinese = (num: number): string => {
  let a = numToChn(num)
  num = Math.floor(num)
  let unitPos = 0
  let strIns = '',
    chnStr = ''
  let needZero = false
  if (num === 0) {
    return chnNumChar[0]
  }
  while (num > 0) {
    let section = num % 10000
    if (needZero) {
      chnStr = chnNumChar[0] + chnStr
    }
    strIns = sectionToChinese(section)
    strIns += section !== 0 ? chnUnitSection[unitPos] : chnUnitSection[0]
    chnStr = strIns + chnStr
    needZero = section < 1000 && section > 0
    num = Math.floor(num / 10000)
    unitPos++
  }
  return chnStr + a
}
